﻿/**************************************************************
 *
 * 唯一标识：0ecfaa53-f3f7-4cc5-af5c-42ad3dbb7c35
 * 命名空间：Sgr.Domain.Uow
 * 创建时间：2023/7/27 11:32:42
 * 机器名称：DESKTOP-S0D075D
 * 创建者：antho
 * 电子邮箱：fengqinhua2016@163.com
 * 描述：
 *
 **************************************************************/

using System;
using System.Threading.Tasks;
using System.Threading;
using System.Diagnostics.CodeAnalysis;
using Sgr.Domain.Uow.Database;

namespace Sgr.Domain.Uow
{
    /// <summary>
    /// 工作单元接口
    /// </summary>
    public interface IUnitOfWork : IUnitOfWorkTransactions, IUnitOfWorkEventHandling, IDatabaseApiContainer, ITransactionApiContainer, IDisposable
    {
        /// <summary>
        /// 工作单元唯一标识
        /// </summary>
        Guid Id { get; }

        /// <summary>
        /// 获取工作单元的选项
        /// </summary>
        UnitOfWorkOption Options { get; }

        /// <summary>
        /// 获取外部工作单元
        /// </summary>
        IUnitOfWork? Outer { get; }

        /// <summary>
        /// 获取服务提供者
        /// </summary>
        IServiceProvider ServiceProvider { get; }

        /// <summary>
        /// 是否是根工作单元
        /// </summary>
        bool IsRoot { get; }

        /// <summary>
        /// 是否已完成
        /// </summary>
        bool IsCompleted { get; }

        /// <summary>
        /// 是否已释放
        /// </summary>
        bool IsDisposed { get; }

        /// <summary>
        /// 初始化工作单元
        /// </summary>
        /// <param name="options"></param>
        void Initialize(UnitOfWorkOption options);

        /// <summary>
        /// 设置外部工作单元
        /// </summary>
        /// <param name="outer"></param>
        void SetOuter(IUnitOfWork? outer);

        /// <summary>
        /// 执行Save操作
        /// </summary>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        Task<bool> SaveEntitiesAsync(CancellationToken cancellationToken = default);
    }

    /// <summary>
    /// 泛型工作单元接口，用于标识特定模块的工作单元
    /// </summary>
    /// <typeparam name="TModule">模块类型标记</typeparam>
    public interface IUnitOfWork<TModule> : IUnitOfWork where TModule : class
    {
    }
}